home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / dsp / 56000tar.z / 56000tar / 56000 / fft / fftr2d.asm < prev    next >
Assembly Source File  |  1991-11-25  |  4KB  |  106 lines

  1. ;
  2. ; This program originally available on the Motorola DSP bulletin board.
  3. ; It is provided under a DISCLAMER OF WARRANTY available from
  4. ; Motorola DSP Operation, 6501 Wm. Cannon Drive W., Austin, Tx., 78735.
  5. ; Radix 2, In-Place, Decimation-In-Time FFT
  6. ; (using DSP56001 Y Data ROM sine-cosine tables).
  7. ; Last Update 08 Aug 86   Version 1.0
  8. ;
  9. fftr2d  macro   points,data,coef,table
  10. fftr2d  ident   1,0
  11. ;
  12. ; Radix 2 Decimation in Time In-Place Fast Fourier Transform Routine
  13. ;
  14. ;    Complex input and output data
  15. ;        Real data in X memory
  16. ;        Imaginary data in Y memory
  17. ;    Normally ordered input data
  18. ;    Bit reversed output data
  19. ;       Coefficient lookup table
  20. ;        Full cycle sinewave in Y memory
  21. ;       Coefficient table can be generated by "sinewave" macro.
  22. ;
  23. ;       This FFT version can directly use the sinewave table stored
  24. ;       in the DSP56001 Y Data ROM for up to 256 point complex FFTs.
  25. ;
  26. ; Macro Call - fftr2d   points,data,coef,table
  27. ;
  28. ;       points     number of points (2-32768, power of 2)
  29. ;       data       starting address of data buffer
  30. ;       coef       starting address of sinewave table
  31. ;       table      size of sinewave table
  32. ;
  33. ; Alters Data ALU Registers
  34. ;       x1      x0      y1      y0
  35. ;       a2      a1      a0      a
  36. ;       b2      b1      b0      b
  37. ;
  38. ; Alters Address Registers
  39. ;       r0      n0      m0
  40. ;       r1      n1      m1
  41. ;               n2
  42. ;
  43. ;       r4      n4      m4
  44. ;       r5      n5      m5
  45. ;       r6      n6      m6
  46. ;       r7      n7      m7
  47. ;
  48. ; Alters Program Control Registers
  49. ;       pc      sr
  50. ;
  51. ; Uses 6 locations on System Stack
  52. ;
  53. ; Latest Revision - August 8, 1986
  54. ;
  55.         page
  56.         move    #points/2,n0    ;initialize butterflies per group
  57.         move    #1,n2           ;initialize groups per pass
  58.         move    #table/4,n6     ;initialize C pointer offset
  59.         move    n6,n7
  60.         move    #-1,m0          ;initialize A and B address modifiers
  61.         move    m0,m1           ;for linear addressing
  62.         move    m0,m4
  63.         move    m0,m5
  64.         move    m0,m7
  65.         move    #0,m6           ;initialize C address modifier for
  66.                                 ;reverse carry (bit-reversed) addressing
  67. ;
  68. ; Perform all FFT passes with triple nested DO loop
  69. ;
  70.         do      #@cvi(@log(points)/@log(2)+0.5),_end_pass
  71.         move    #data,r0        ;initialize A input pointer
  72.         move    r0,r4           ;initialize A output pointer
  73.         lua     (r0)+n0,r1      ;initialize B input pointer
  74.         move    #coef,r6        ;initialize C input pointer
  75.         lua     (r1)-,r5        ;initialize B output pointer
  76.         move    n0,n1           ;initialize pointer offsets
  77.         move    n0,n4
  78.         move    n0,n5
  79.  
  80.         do      n2,_end_grp
  81.         move    r6,r7           ;get sine pointer
  82.         move    x:(r1),x1       y:(r6)+n6,y0    ;lookup sine value
  83.         move    x:(r5),a        y:(r0),b        ;preload data
  84.         move    y:(r7+n7),x0            ;lookup cosine value
  85.  
  86.  
  87.         do      n0,_end_bfy     ;Radix 2 DIT butterfly kernel
  88.         mac     -x1,y0,b                        y:(r1)+,y1
  89.         macr    x0,y1,b         a,x:(r5)+       y:(r0),a
  90.         subl    b,a             x:(r0),b        b,y:(r4)
  91.         mac     x1,x0,b         x:(r0)+,a       a,y:(r5)
  92.         macr    y1,y0,b         x:(r1),x1
  93.         subl    b,a             b,x:(r4)+       y:(r0),b
  94. _end_bfy
  95.         move    a,x:(r5)+n5     y:(r1)+n1,y1    ;update A and B pointers
  96.         move    x:(r0)+n0,x1    y:(r4)+n4,y1
  97. _end_grp
  98.         move    n0,b1
  99.         lsr     b       n2,a1   ;divide butterflies per group by two
  100.         lsl     a       b1,n0   ;multiply groups per pass by two
  101.         move    a1,n2
  102. _end_pass
  103.         endm
  104.